23 字符设备
鼠标:drivers/input/mouse/logibm.c
/*
* Logitech Bus Mouse Driver for Linux
*/
module_init(logibm_init);
module_exit(logibm_exit);
打印机:drivers/char/lp.c
/*
* Generic parallel printer driver
*/
module_init(lp_init_module);
module_exit(lp_cleanup_module);
内核模块
头文件
定义函数处理内核模块的主要逻辑
定义 file_operations 结构
定义整个模块的初始化函数和退出函数
调用 module_init 和 module_exit
声明 lisense,调用 MODULE_LICENSE
打开字符设备
注册字符设备,分配 struct cdev 结构将 cdev 的 ops 成员变量指向这个模块声明的 file_operations。cdev_add 将这个字符设备添加到内核中 struct kobj_map *cdev_map 结构,统一管理所有字符设备。
内核模块加载完毕后,接下来要通过 mknod 在 /dev 下面创建一个设备文件。
写入字符设备
用 文件系统的标准接口 write,参数文件描述符 fd,在内核里面调用的 sys_write,在 sys_write 里面根据文件描述符 fd 得到 struct file 结构,再调用 vfs_write。
使用 IOCTL 控制设备
cmd 的组成:
- 最低八位为 NR,是命令号;
- 八位是 TYPE,是类型;
- 十四位是参数的大小;
- 最高两位是 DIR,是方向,表示写入、读出,还是读写。
中断发生的四个层次
- 外部设备给中断控制器发送物理中断信号。
- 中断控制器将物理中断信号转换成为中断向量 interrupt vector,发给各个 CPU。
- 每个 CPU 都会有一个中断向量表,根据 interrupt vector 调用一个 IRQ 处理函数。
- 在 IRQ 处理函数中,将 interrupt vector 转化为抽象中断层的中断信号 irq,调用中断信号 irq 对应的中断描述结构里面的 irq_handler_t。